#pragma once

/**
 * @file macros.h
 * @brief 定义通用宏和工具函数
 * @details 提供分支预测、断言和错误处理等实用工具
 */

#include <cstring>
#include <iostream>

/**
 * @brief 分支预测提示宏
 * @details 使用GCC的__builtin_expect指令来优化条件分支的性能
 */
/**
 * @brief 标记条件很可能为真
 * @param x 要评估的条件表达式
 * @details 告知编译器该条件很可能为真，优化分支预测
 */
#define LIKELY(x) __builtin_expect(!!(x), 1)
/**
 * @brief 标记条件很可能为假
 * @param x 要评估的条件表达式
 * @details 告知编译器该条件很可能为假，优化分支预测
 */
#define UNLIKELY(x) __builtin_expect(!!(x), 0)

/**
 * @brief 断言检查函数
 * @details 检查条件，如果不为真则输出错误消息并退出程序
 */
/**
 * @brief 断言检查函数
 * @param cond 要检查的条件
 * @param msg 当条件不满足时要显示的错误消息
 * @details 如果条件为假，则将错误消息输出到标准错误流并终止程序
 */
inline auto ASSERT(bool cond, const std::string &msg) noexcept {
  if (UNLIKELY(!cond)) {
    std::cerr << "ASSERT : " << msg << std::endl;

    exit(EXIT_FAILURE);
  }
}

/**
 * @brief 致命错误处理函数
 * @param msg 要显示的错误消息
 * @details 输出致命错误消息并立即终止程序执行
 */
inline auto FATAL(const std::string &msg) noexcept {
  std::cerr << "FATAL : " << msg << std::endl;

  exit(EXIT_FAILURE);
}
